5-1. 컨테이너 오케스트레이션 도구, 쿠버네티스 - 파트 1
5.1. 컨테이너 오케스트레이션
5.1.1. 오케스트레이션이란
컨테이너 기술에서 **오케스트레이션(Orchestration)**은 컨테이너의 관리 및 운영을 자동화하는 것을 나타냄. 실제로 컨테이너를 관리·운영할 때 공통적으로 필요한 작업은 크게 로드 밸런싱 / 헬스 체크 / 스케일링 세 가지임.
용어 정리
- 오케스트레이션 (Orchestration): 다수의 컨테이너를 배치·감시·확장·복구하는 관리 운영 작업을 자동화하는 것
컨테이너 오케스트레이션의 3대 작업:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
[오케스트레이션]
│
┌─────────────────┼─────────────────┐
▼ ▼ ▼
┌───────────┐ ┌───────────┐ ┌───────────┐
│ 로드 밸런싱 │ │ 헬스 체크 │ │ 스케일링 │
└───────────┘ └───────────┘ └───────────┘
요청을 분산해 정상 동작 여부를 요청 규모에 따라
부하를 나눔 감시 컨테이너를 증감
│ │ │
└────── 결합 ──────┘ │
비정상 컨테이너로의 배분 중지 리소스 소비 최적화
→ 가동 시간(가용성) 증가 → 리소스 부족 다운 방지
5.1.2. 로드 밸런싱
- 로드 밸런싱(Load Balancing): 여러 컨테이너에 요청을 할당해 부하를 분산하는 것
- 구현 방법 중 하나는 요청을 배분하는 로드 밸런싱 장치를 컨테이너 앞에 배치하는 것
- 웹 응용 프로그램이라면 웹 서버 / AP 서버 / DB 서버 각 계층 앞에 로드 밸런싱 장치를 설치
- 효과
- 컨테이너당 부하를 줄이고 처리 시간 단축
- 단위 시간당 처리할 수 있는 요청 수 증가 → 시스템 성능 향상
계층별 로드 밸런싱 배치:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
요청
│
▼
[LB] ──┬──→ [웹 컨테이너 1]
└──→ [웹 컨테이너 2]
│
▼
[LB] ──┬──→ [AP 컨테이너 1]
└──→ [AP 컨테이너 2]
│
▼
[LB] ──┬──→ [DB 컨테이너 1]
└──→ [DB 컨테이너 2]
5.1.3. 헬스 체크
- 헬스 체크(Health Check): 컨테이너가 정상적으로 실행 중인지 감시하는 것
- 구현 방법 중 하나는 컨테이너에 요청을 보내고 정상적으로 응답을 반환하는지 확인하는 것
- 각 계층 앞의 로드 밸런싱 장치가 계층에 포함된 컨테이너로 요청을 보내고, 정상 응답이 없으면 "제대로 작동하지 않는다"고 판단
- 로드 밸런싱 + 헬스 체크 결합 → 정상 동작하지 않는 컨테이너로의 배분을 중지 → 시스템이 정상 가동되는 시간을 늘릴 수 있음
5.1.4. 스케일링
- 스케일링(Scaling): 요청 규모에 따라 컨테이너를 늘리거나 줄이는 것
- 구현 방법 중 하나는 요청 수 같은 측정 항목(메트릭)이 임곗값을 초과하거나 크게 밑돌 때 리소스를 증감하는 것
- 예: "최근 1분 동안 웹 서버 계층이 수신한 요청 수가 컨테이너 1개당 500개를 초과하면 웹 서버 계층의 컨테이너를 1대 늘린다"
- 효과
- 리소스 소비 최적화
- 리소스 부족으로 인한 시스템 다운 방지
5.1.5. 오케스트레이션의 중요성
- 로드 밸런싱이나 헬스 체크는 수동으로도 실행할 수 있음
- 그러나 관리·운영하는 컨테이너의 수가 늘어날수록 수동 대응은 어려워짐
- 애플리케이션이 보급되고 규모가 커질수록, 컨테이너 관리·운영의 공통 작업을 자동화하는 오케스트레이션의 중요성은 점점 커짐
| 작업 | 목적 | 대표 구현 방법 | 얻는 효과 |
|---|---|---|---|
| 로드 밸런싱 | 부하 분산 | 계층 앞에 로드 밸런싱 장치 배치 | 처리 시간 단축·처리량 증가 |
| 헬스 체크 | 정상 동작 감시 | 요청을 보내 응답 여부 확인 | 비정상 컨테이너 배제 → 가용성 향상 |
| 스케일링 | 규모 조절 | 메트릭 임곗값 기준 증감 | 리소스 최적화·리소스 부족 다운 방지 |
5.2. 쿠버네티스: 컨테이너의 관리 및 운영을 자동화하는 도구
5.2.1. 쿠버네티스란
- 쿠버네티스(Kubernetes): 컨테이너를 오케스트레이션하는 도구
- 구글에서 개발해 오픈 소스로 공개함
5.2.2. 쿠버네티스에서 가능한 것
- 컨테이너의 관리 및 운영을 자동화할 수 있어, 컨테이너를 활용한 애플리케이션 운영에 필요한 부하를 줄일 수 있음
- 수행할 수 있는 작업의 예
- 로드 밸런싱
- 헬스 체크
- 엔드포인트 제공
5.2.3. 쿠버네티스에서 불가능한 것
- 컨테이너 관리·운영에 도움이 되는 기능을 다양하게 제공하지만, 단독으로만 사용할 수 없는 경우도 있음
- 쿠버네티스가 제공하지 않는 기능
- 자동 빌드
- 미들웨어 기능
- 이를 구현하려면 쿠버네티스 이외의 도구나 서비스를 함께 사용해야 함
5.2.4. 컨테이너 오케스트레이션 도구의 사실상 표준
- 컨테이너 오케스트레이션 도구가 쿠버네티스만 있는 것은 아님
- 도커 스웜 모드: 도커 엔진에 내장된 컨테이너 관리·운영 자동화 기능
- 아파치 메소스 + 마라톤: 클러스터 관리자인 아파치 메소스와, 메소스에서 컨테이너를 처리하기 위해 만든 프레임워크인 마라톤을 결합하면 쿠버네티스처럼 사용할 수 있음
- 이처럼 선택지는 다양하지만, 쿠버네티스가 컨테이너 오케스트레이션 도구의 사실상 표준(De Facto Standard)이 되었음 (도커 데스크톱에도 쿠버네티스가 내장되어 로컬에서 바로 사용 가능)
2026-10 갱신
- 아파치 메소스는 Apache Attic으로 이관(프로젝트 은퇴)되어 더 이상 개발되지 않음. 마라톤 역시 사실상 개발 중단 → 현재 선택지로는 부적합
- 원문의 "도커 데스크톱과 더불어 사실상 표준"은 오케스트레이션 도구가 아닌 도커 데스크톱을 같은 범주로 묶은 어색한 표현이므로, 도커 데스크톱은 쿠버네티스를 내장 제공한다는 의미로 정리
5.2.5. 쿠버네티스 클러스터란
- 쿠버네티스는 대량의 컨테이너 및 서버로 구축된 서비스의 관리·운영 부하를 줄일 수 있음
- 클러스터(Cluster): 이러한 시스템의 집합. 쿠버네티스가 관리하는 클러스터를 쿠버네티스 클러스터라고 함
- 노드(Node): 클러스터를 구성하는 각 서버
5.2.6. 노드의 두 가지 유형
- 워커 노드(Worker Node): 실제로 파드를 구동하는 노드
- 마스터 노드(Master Node): 워커를 제어하는 노드
- 파드에는 하나 이상의 컨테이너가 존재함
- 사용자는 워커에 직접 파드를 실행하지 않고, 마스터를 통해 워커 상의 파드를 실행함
- 워커와 마스터는 컨테이너 시작 및 모니터링과 관련한 다양한 프로그램을 실행함
용어 정리
- 쿠버네티스 클러스터 (Kubernetes Cluster): 쿠버네티스가 관리하는 서버(노드)들의 집합
- 노드 (Node): 클러스터를 구성하는 각 서버
- 마스터 노드 (Master Node): 워커를 제어하는 노드. 사용자의 요청 창구
- 워커 노드 (Worker Node): 실제로 파드(컨테이너)를 구동하는 노드
2026-10 갱신
- 쿠버네티스 공식 문서는 "마스터 노드" 대신 컨트롤 플레인(Control Plane) 이라는 용어를 사용함 (kube-apiserver·etcd·kube-scheduler·kube-controller-manager 등으로 구성). 노드 레이블·테인트도
node-role.kubernetes.io/master→node-role.kubernetes.io/control-plane으로 변경됨. 본 노트는 원서 표기를 유지
쿠버네티스 클러스터 구성:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
[사용자]
│ 워커에 직접 실행하지 않고, 마스터를 통해 요청
▼
┌──────────────────┐
│ 마스터 노드 │ ← 워커를 제어 · 상태 감시
└────────┬─────────┘
│ 제어
┌──────┴────────────┬─────────────────┐
▼ ▼ ▼
┌────────────┐ ┌────────────┐ ┌────────────┐
│ 워커 노드 1 │ │ 워커 노드 2 │ │ 워커 노드 3 │
│ ┌────┐┌────┐│ │ ┌────┐ │ │ ┌────┐ │
│ │파드││파드││ │ │파드│ │ │ │파드│ │
│ └────┘└────┘│ │ └────┘ │ │ └────┘ │
└────────────┘ └────────────┘ └────────────┘
└───────── 쿠버네티스 클러스터 ─────────┘
5.3. 파드: 컨테이너를 관리하는 단위
5.3.1. 파드란
- 파드(Pod): 쿠버네티스가 컨테이너를 관리하는 최소 단위이며 하나 이상의 컨테이너로 구성됨
- 같은 파드에 포함된 컨테이너는
- 스토리지와 네트워크를 공유하며 이를 통해 상호 작용할 수 있음
- 프로세스의 네임스페이스를 공유하도록 설정할 수 있음 → 한 컨테이너의 프로세스에서 다른 컨테이너의 프로세스를 참조 가능
- 라이프 사이클이 같음 → 한 컨테이너가 시작되면 다른 컨테이너도 모두 시작되고, 한 컨테이너가 중지되면 다른 컨테이너도 모두 중지됨
용어 정리
- 파드 (Pod): 쿠버네티스가 컨테이너를 관리하는 최소 단위. 스토리지·네트워크·라이프 사이클을 공유하는 하나 이상의 컨테이너 묶음
파드의 내부 구조:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
┌───────────────────────────────────────┐
│ 파드 │
│ ┌────────────┐ ┌────────────┐ │
│ │ 컨테이너 A │ │ 컨테이너 B │ │
│ └─────┬──────┘ └──────┬─────┘ │
│ └────── 공유 ───────┘ │
│ · 네트워크 (localhost · 포트) │
│ · 스토리지 (볼륨) │
│ · (설정 시) 프로세스 네임스페이스 │
│ · 라이프 사이클 (동시 시작 / 동시 정지) │
└───────────────────────────────────────┘
5.3.2. 같은 파드에 포함할지 판단하는 기준
- 일반적으로 같은 파드에 포함된 컨테이너끼리는 서로 밀접한 관계가 있음
- 완전히 관련 없는 컨테이너도 같은 파드에 포함할 수는 있지만 권장하지 않음
- 관련은 있지만 같은 파드 내에서 시작할 필요가 없는 컨테이너는 가능한 한 별도의 파드로 나누는 것이 좋음
- 예: 웹 서버 / AP 서버 / DB 서버
- 하나의 파드에 세 컨테이너를 모두 포함할 수는 있음
- 그러나 컨테이너는 네트워크를 통해 통신할 수 있으므로 반드시 같은 파드에서 시작할 필요가 없음
- 오히려 파드 3개에 컨테이너를 각각 하나씩 포함하는 편이 바람직함
- 별도의 파드로 나누면
- 필요한 컨테이너만 모아서 구동할 수 있음
- 세세하게 스케일링할 수 있음
3계층 애플리케이션의 파드 구성:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
[한 파드에 몰아넣기] [파드별로 분리 — 권장]
┌────────────────────┐ ┌──────┐ ┌──────┐ ┌──────┐
│ 파드 │ │ 파드 │ │ 파드 │ │ 파드 │
│ ┌────┐┌────┐┌────┐ │ │┌────┐│ │┌────┐│ │┌────┐│
│ │ 웹 ││ AP ││ DB │ │ ││ 웹 ││ ││ AP ││ ││ DB ││
│ └────┘└────┘└────┘ │ │└────┘│ │└────┘│ │└────┘│
└────────────────────┘ └──────┘ └──────┘ └──────┘
✗ 필요한 것만 구동 불가 ✓ 필요한 컨테이너만 모아서 구동
✗ 스케일링이 뭉텅이로만 가능 ✓ 계층별로 세세하게 스케일링
5.3.3. 파드의 필요성
- 하나의 파드에서 여러 컨테이너를 시작할 수 있는 것처럼, 하나의 컨테이너에서도 여러 프로세스를 시작할 수 있음 → 그렇다면 컨테이너 대신 파드라는 단위가 왜 필요한가?
- 컨테이너에서 여러 프로세스를 시작하면 → 사용자가 직접 프로세스를 관리해야 함
- 파드 내에서 여러 컨테이너를 시작하면 → 쿠버네티스가 컨테이너를 관리할 수 있음
- 컨테이너 관리를 쿠버네티스에 맡길 때의 이점
- 사용자가 컨테이너별로 직접 프로세스를 관리하는 것보다 운영 부하 및 리소스 소비 감소
- 컨테이너별로 필요한 최소한의 패키지만 설치해 불필요한 것을 최대한 줄이는 등 소프트웨어 의존성을 유연하게 관리
5.3.4. 파드의 디자인 패턴
- 일반적인 사용 방법은 one-container-per-pod(파드당 컨테이너 하나)
- 그러나 여러 컨테이너를 하나의 파드에 포함하는 것이 효과적일 때도 있음
- 보조 역할을 담당하는 컨테이너를 같은 파드에 추가하면 기본 컨테이너의 기능을 더욱 확장할 수 있음
- 사이드카 컨테이너(Sidecar Container): 이처럼 보조 역할을 담당하는 컨테이너. 자주 사용하는 디자인 패턴
one-container-per-pod vs 사이드카 패턴:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
[기본형: one-container-per-pod] [사이드카 패턴]
┌──────────────┐ ┌────────────────────────────┐
│ 파드 │ │ 파드 │
│ ┌──────────┐ │ │ ┌──────────┐ ┌───────────┐ │
│ │ 기본 │ │ │ │ 기본 │ │ 사이드카 │ │
│ │ 컨테이너 │ │ │ │ 컨테이너 │ │(예: Envoy)│ │
│ └──────────┘ │ │ └──────────┘ └───────────┘ │
└──────────────┘ │ 기본 기능을 보조 · 확장 │
└────────────────────────────┘
5.3.5. 사이드카 컨테이너를 사용하는 경우
- 공통된 기능을 묶어서 재사용하는 방법이 사이드카 컨테이너만 있는 것은 아님
- 패키지로 프로세스에 통합하거나
- 별도의 파드에 포함해 파드 간 통신할 수도 있음
- 그렇다면 어떤 상황에서 사이드카가 바람직한가? → 명확한 기준은 없음
- 다만 파드별로 기능을 설정하고 싶을 때
- 컨테이너를 사용하되 도커 또는 쿠버네티스에서 간단하게 다루고 싶을 때 적합함
- 대표 사례: Envoy
- 파드 통신을 제어하는 기능을 갖춘 프록시로, 사이드카 컨테이너에 적합
- Envoy를 각 파드에 사이드카로 넣는 작업은 수동으로도 가능하지만, Envoy를 집중적으로 관리하는 Istio를 사용하면 자동화할 수 있음
용어 정리
- 사이드카 컨테이너 (Sidecar Container): 기본 컨테이너의 기능을 보조·확장하기 위해 같은 파드에 함께 배치하는 컨테이너
- Envoy: 파드 통신을 제어하는 프록시. 대표적인 사이드카 컨테이너 활용 사례
- Istio: Envoy를 집중적으로 관리해 사이드카 배치를 자동화하는 소프트웨어
5.4. 디플로이먼트 컨트롤러: 오케스트레이션을 지원하는 가장 중요한 요소
5.4.1. 레플리카셋이란
- 레플리카셋(ReplicaSet): 쿠버네티스가 파드를 관리하기 위한 단위로, 대상 파드의 복제를 지정한 수만큼 유지하는 기능
- 파드는 하나 이상의 컨테이너 그룹이지만, 레플리카셋은 하나 이상의 파드 그룹
- 파드는 다른 유형의 컨테이너를 포함할 수 있음
- 레플리카셋은 같은 유형의 파드만 포함할 수 있음
- 레플리카셋으로 해결할 수 있는 것
- 파드 수를 지정한 수만큼 일정하게 유지 → 컨테이너 헬스 체크, 중지된 컨테이너 재시작
- 파드 수를 늘리거나 줄여서 스케일링
- 오래된 레플리카셋의 파드 수를 점진적으로 줄이는 동시에 새 레플리카셋의 파드 수를 점진적으로 늘리는 롤링 업데이트
5.4.2. 디플로이먼트란
- 디플로이먼트(Deployment): 레플리카셋을 더욱 그룹화하고 관리하는 단위
- 레플리카셋이 유지하는 파드 수를 증감하거나 레플리카셋을 생성함
- 포함 관계: 디플로이먼트 > 레플리카셋 > 파드 > 컨테이너
- 디플로이먼트가 필요한 이유
- 자신을 포함하는 레플리카셋이나 파드를 자동으로 갱신하기 위한 구조를 갖추고 있기 때문
- 레플리카셋만으로도 스케일링·롤링 업데이트는 가능하지만, 디플로이먼트를 사용하면 쿠버네티스가 자동으로 파드 수를 조정하고 새 레플리카셋을 만들 수 있음
- 디플로이먼트는 아무 관련이 없는 레플리카셋도 포함할 수 있지만, 같은 레플리카셋의 다른 버전을 포함하는 것이 일반적임
쿠버네티스 리소스의 포함 관계:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
┌────────────────────────────────────────────────────┐
│ 디플로이먼트 │
│ ┌─────────────────────┐ ┌─────────────────────┐ │
│ │ 레플리카셋 v1 │ │ 레플리카셋 v2 │ │
│ │ ┌──────┐ ┌──────┐ │ │ ┌──────┐ │ │
│ │ │ 파드 │ │ 파드 │ │ │ │ 파드 │ │ │
│ │ │┌────┐│ │┌────┐│ │ │ │┌────┐│ │ │
│ │ ││컨테││ ││컨테││ │ │ ││컨테││ │ │
│ │ ││이너││ ││이너││ │ │ ││이너││ │ │
│ │ │└────┘│ │└────┘│ │ │ │└────┘│ │ │
│ │ └──────┘ └──────┘ │ │ └──────┘ │ │
│ └─────────────────────┘ └─────────────────────┘ │
│ 파드 수 점진 감소 ←→ 파드 수 점진 증가 │
│ (롤링 업데이트) │
└────────────────────────────────────────────────────┘
5.4.3. 컨트롤러란
- 컨트롤러(Controller): 일반적으로 현재 상태를 설정한 상태로 만드는 메커니즘
- 비유: 에어컨 컨트롤러는 현재 실내 온도를 측정하고, 측정된 실내 온도와 에어컨 설정 온도의 차이가 0이 되도록 방의 온도를 낮추거나 높임
- 쿠버네티스의 컨트롤러: 레플리카셋·디플로이먼트와 같은 상태를 감시하고, 현재 상태와 설정한 상태에 차이가 있을 때 파드 수를 늘리거나 레플리카셋을 만들어 차이가 없도록 조정함
컨트롤러의 조정 루프 (현재 상태 → 설정한 상태):
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
[설정한 상태] [현재 상태]
파드 3개 ←비교→ 파드 2개
│ │
└──────────┬────────────┘
▼
차이 발생 → 동작 결정 → 동작 실행
│ │
▼ ▼
"파드 1개 부족" 파드 1개 추가 생성
│ │
└──── 차이 0 ◀────┘
(에어컨 = 설정 온도와 실내 온도의 차이를 0으로 만드는 것과 동일한 원리)
5.4.4. 디플로이먼트 컨트롤러란
- 디플로이먼트 컨트롤러(Deployment Controller): 디플로이먼트를 특정한 상태로 유지하는 컨트롤러
- 동작 방식
- 디플로이먼트의 상태를 감시
- 현재 상태와 설정한 상태에 차이가 생기면, 차이의 상태에 따라 취해야 할 동작을 결정
- 결정한 동작을 실행
- 예: 파드에 포함된 컨테이너 자체에는 변경이 없고 레플리카셋에 포함된 파드 수만 변경된 경우 → 디플로이먼트 컨트롤러는 레플리카셋의 파드 수만 업데이트하면 된다고 판단
- 디플로이먼트 컨트롤러는 파드·레플리카셋과 마찬가지로 가장 기본적인 구조이며, 쿠버네티스의 오케스트레이션을 지원함
용어 정리
- 레플리카셋 (ReplicaSet): 같은 유형의 파드를 지정한 수만큼 유지하는 관리 단위
- 디플로이먼트 (Deployment): 레플리카셋을 그룹화·관리하며, 레플리카셋과 파드의 갱신을 자동화하는 단위
- 컨트롤러 (Controller): 현재 상태를 설정한 상태로 맞추는 메커니즘
- 롤링 업데이트 (Rolling Update): 구버전 파드를 점진적으로 줄이고 신버전 파드를 점진적으로 늘려 교체하는 방식
5.5. 서비스: 컨테이너에 접속하는 창구
5.5.1. 서비스란
- 서비스(Service): 컨테이너에 접속하기 위한 창구인 엔드포인트(Endpoint)를 제공하는 방식
- 외부에서는 컨테이너에 직접 접속하는 것이 아니라 엔드포인트를 통해 간접적으로 접속함
- 도커의 경우: 컨테이너를 실행할 때 컴퓨터 포트와 컨테이너 포트를 바인딩하고, 바인딩된 컴퓨터의 포트에 접속해 컨테이너에 접속할 수 있음
- 쿠버네티스의 경우
- 레플리카셋·디플로이먼트의 구조에 따라 컨테이너의 실행과 정지를 반복함
- 접속하려는 컨테이너가 같은 시스템에서 실행된다고 단정할 수도 없음
- 이러한 상황에서도 대상 컨테이너에 정확하게 접속할 수 있게 하는 방법이 서비스
5.5.2. 서비스의 구조
- 쿠버네티스는 가상 IP 주소와 **네트워크 주소 변환(NAT)**을 조합해 서비스 작동 방식을 구현함
- 가상 IP 주소: 물리적 또는 가상 컴퓨터에 할당할 수 없는 IP 주소이자 엔드포인트
- 가상 IP 주소에 접속하면 네트워크 주소 변환에 따라 대상 컨테이너로 전달됨
- 예시 흐름
- 엔드포인트의 가상 IP 주소
10.240.0.100에 접속 - 서비스 작동 방식을 통해 네트워크 주소가 변환되어 파드 A의 IP 주소
10.240.0.101로 전환 - 엔드포인트에 대한 접속이 파드 A로 옮겨졌지만, 네트워크 주소 변환의 결과에 따라 파드 B나 파드 C로 전환할 수도 있음
- 엔드포인트의 가상 IP 주소
서비스의 작동 방식 (가상 IP + 네트워크 주소 변환):
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
[클라이언트]
│ 접속: 10.240.0.100 (엔드포인트 = 가상 IP 주소)
▼
┌──────────────────────────┐
│ 서비스 │
│ 네트워크 주소 변환(NAT) │
└────────────┬─────────────┘
┌─────────┼─────────────┬──────────────┐
▼ ▼ ▼ ▼
┌────────────┐ ┌────────────┐ ┌────────────┐
│ 파드 A │ │ 파드 B │ │ 파드 C │
│10.240.0.101│ │10.240.0.102│ │10.240.0.103│
└────────────┘ └────────────┘ └────────────┘
→ 변환 결과에 따라 어느 파드로든 전환 가능 (= 로드 밸런싱)
5.5.3. 서비스 유형
엔드포인트를 제공하는 방법의 차이에 따라 서비스는 네 가지 유형으로 분류됨.
| 유형 | 설명 | 클러스터 외부 접속 |
|---|---|---|
| ClusterIP | 클러스터 내부에서만 접속할 수 있는 가상 IP 주소가 생성됨 | ✗ |
| NodePort | 클러스터의 모든 노드의 지정된 포트에 대한 접속이 컨테이너로 전달됨 | ○ |
| LoadBalancer | 클라우드 서비스의 로드 밸런서에 대한 접속이 컨테이너로 전송됨 | ○ |
| ExternalName | 서비스에 대한 접속이 지정된 호스트로 전달됨 | (외부 호스트로 전환) |
5.5.4. 서비스에 의한 로드 밸런싱
- 서비스의 역할은 엔드포인트 제공만이 아니라 로드 밸런싱도 포함함
- 엔드포인트에 대한 접속을 여러 컴퓨터에서 실행되는 같은 유형의 컨테이너로 분배해 서버당 부하를 줄일 수 있음
- 쿠버네티스의 서비스는 Discovery & LB라는 리소스 유형으로 분류하며, 컨테이너 관리·운영에서 **이름 확인(Discovery)**과 로드 밸런싱(LB) 두 가지 문제를 해결하는 데 사용함
- ExternalName 이외의 서비스: 쿠버네티스가 자동으로 로드 밸런싱을 수행
- ExternalName: 대상 호스트가 로드 밸런싱을 수행하도록 사용자가 직접 구성해야 함
5.5.5. 각 서비스의 구분
- 클러스터 내부에서 접속하는 것만으로 충분 → ClusterIP가 적합
- 클러스터 외부에서 접속해야 함 → LoadBalancer가 적합
- NodePort
- 클러스터 내부 접속에도 사용할 수 있지만, 클러스터의 모든 노드에 대해 지정된 포트를 소유해야 하므로 포트를 절약하려면 ClusterIP를 쓰는 것이 좋음
- 클러스터 외부 접속에도 사용할 수 있지만, 대부분의 경우 서비스에 대한 접속을 단일 엔드포인트로 집약해야 해서 클라우드 서비스의 로드 밸런싱 장치 등이 필요함
- 즉 중립적인 위치에 있는 NodePort는 클러스터 내부에서 접속하는 것이 주 역할이며, 클러스터 외부에서 내부 동작을 확인하기 위해 접속하거나 자체적으로 로드 밸런싱 구조를 갖추는 등 예외 상황에서 강점을 발휘함
- ExternalName
- NodePort와 마찬가지로 독특한 서비스
- 클러스터 내부에서 접속할 수 있다는 점은 ClusterIP와 동일
- 다만 클러스터 외부의 호스트를 접속 전환 대상으로 지정할 수 있다는 점이 다름
| 상황 | 권장 유형 | 이유 |
|---|---|---|
| 클러스터 내부 접속만 필요 | ClusterIP | 노드 포트를 소비하지 않아 포트를 절약할 수 있음 |
| 클러스터 외부에서 접속 | LoadBalancer | 접속을 단일 엔드포인트로 집약할 수 있음 |
| 내부 동작 확인·자체 LB 구성 등 예외 | NodePort | 모든 노드의 지정 포트로 직접 접속 가능 |
| 클러스터 외부 호스트로 전환 | ExternalName | 내부에서 접속하되 대상은 외부 호스트 |
용어 정리
- 서비스 (Service): 컨테이너 접속 창구인 엔드포인트를 제공하고 로드 밸런싱을 수행하는 쿠버네티스의 방식
- 엔드포인트 (Endpoint): 컨테이너에 간접적으로 접속하기 위한 창구(가상 IP 주소 등)
- 네트워크 주소 변환 (NAT): 패킷의 IP 주소를 다른 주소로 바꿔 전달하는 기술
- Discovery & LB: 이름 확인과 로드 밸런싱 문제를 해결하는 쿠버네티스 리소스 유형
5.6. 플라넬: 컨테이너 간 상호 접속을 지원하는 기술
5.6.1. 파드 내 통신
- 같은 파드에 포함된 컨테이너는 다른 컨테이너와 네트워크 네임스페이스를 공유하므로 로컬호스트에 접속하면 서로 통신할 수 있음
- 예: 어떤 컨테이너의 웹 서버가 TCP/3000 포트로 수신 대기 중이고, 다른 컨테이너의 웹 클라이언트가
localhost:3000으로 HTTP 요청을 보내면 웹 서버가 그 요청을 수신하고, 클라이언트는 웹 서버가 반환하는 응답을 받을 수 있음
- 예: 어떤 컨테이너의 웹 서버가 TCP/3000 포트로 수신 대기 중이고, 다른 컨테이너의 웹 클라이언트가
- 주의: 네트워크 네임스페이스가 공유되므로 특정 컨테이너가 수신 대기하는 포트를 다른 컨테이너가 수신 대기할 수 없음
- 따라서 하나의 파드에 여러 컨테이너를 포함하는 경우 포트가 충돌하지 않도록 조정해야 함
5.6.2. 파드 간 통신
- 파드에는 고유한 IP 주소가 할당됨 → 이 IP 주소에 접속하면 외부에서 파드에 포함된 컨테이너에 접속할 수 있음
- 만약 각 파드에 고유한 IP 주소가 할당되지 않는다면
- 컴퓨터의 포트를 파드 포트에 할당한 뒤 컴퓨터 포트를 통해 파드에 접속해야 함
- 이 방법은 접속할 때 IP 주소 외에 포트도 지정해야 하므로 더 복잡함
- 컴퓨터의 포트 수에는 제한이 있고, 같은 포트를 다른 파드의 포트에 할당할 수 없으므로 한 컴퓨터에서 사용할 수 있는 파드 수에 제한이 생김
- 각 파드에 고유한 IP 주소를 할당하면 이러한 문제와 상관없이 파드 간 통신이 가능함
파드 내 통신 vs 파드 간 통신:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
[파드 내 통신] [파드 간 통신]
┌─────────────────────────┐ ┌──────────┐ ┌──────────┐
│ 파드 │ │ 파드 A │ │ 파드 B │
│ ┌─────────┐┌──────────┐ │ │10.244.1.5│ ─────→ │10.244.2.7│
│ │ 웹 클라이 ││ 웹 서버 │ │ └──────────┘ IP └──────────┘
│ │ 언트 ││ :3000 │ │ (노드 1) 주소만 (노드 2)
│ └────┬────┘└─────▲────┘ │
│ └─ localhost ┘ │ → 파드마다 고유 IP → 포트 지정 불필요
│ 네트워크 네임스페이스 공유 │ → 노드의 포트 수 제한과 무관
│ ※ 포트 충돌하지 않게 조정 │
└─────────────────────────┘
5.6.3. 플라넬이란
- 쿠버네티스는 파드 간 통신에 대해 **"특정 노드의 파드는 모든 노드의 모든 파드와 네트워크 주소 변환을 사용하지 않고 통신할 수 있다"**는 요건만 정해져 있고, 이 요건을 어떻게 구현할지는 클러스터를 구축할 때 정함
- 플라넬(Flannel): 쿠버네티스에서 네트워크를 구축하는 방법 중 하나
- 쿠버네티스 클러스터를 구성하는 여러 시스템을 연결하는 오버레이 네트워크를 구축함
- 플라넬이 구축하는 IPv4 네트워크 덕분에 특정 컴퓨터의 파드에서 다른 컴퓨터의 파드로 접속할 수 있음
5.6.4. flanneld란
- flanneld: 플라넬이 IPv4 네트워크를 구축하기 위해 쿠버네티스 클러스터를 구성하는 모든 컴퓨터에서 구동되는 에이전트 프로그램
- 역할
- IP 주소로 파드끼리 통신할 때, 목적지가 되는 파드가 구동하고 있는 컴퓨터를 특정해 그 컴퓨터로 패킷을 전송
- IPv4 네트워크에서 IP 주소가 충돌하지 않도록 각 노드에 고유한 서브넷을 할당
- 네트워크 구성이나 할당한 서브넷 등의 정보를 기록하기 위해 쿠버네티스의 데이터 스토어인 etcd에 데이터를 저장함
플라넬의 오버레이 네트워크:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
┌────────────────────────┐ ┌────────────────────────┐
│ 노드 1 │ │ 노드 2 │
│ 서브넷 10.244.1.0/24 │ │ 서브넷 10.244.2.0/24 │
│ ┌──────┐ ┌──────┐ │ │ ┌──────┐ │
│ │ 파드 │ │ 파드 │ │ │ │ 파드 │ │
│ └──────┘ └──────┘ │ │ └──────┘ │
│ [ flanneld ] │ │ [ flanneld ] │
└───────────┬────────────┘ └───────────┬────────────┘
└─────── 오버레이 네트워크(IPv4) ────┘
│
▼
[ etcd ] ← 네트워크 구성 · 할당 서브넷 정보 저장
flanneld: 목적지 파드가 있는 컴퓨터를 특정해 패킷 전송 / 노드별 고유 서브넷 할당
5.6.5. 플라넬과 서비스의 차이
- 플라넬: 클러스터 내 다른 컴퓨터에 있는 파드 간 통신을 가능하게 하는 구조
- 서비스: 파드에 접속하기 위한 엔드포인트를 제공하는 구조
- 둘 다 비슷한 기능을 가지고 있지만, 플라넬은 기반 기술의 역할이 강함
- 서비스가 엔드포인트로 접속해 다른 컴퓨터의 파드에 연결할 때 플라넬이 구축한 IPv4 네트워크를 사용함
- 만약 플라넬로 구축한 IPv4 네트워크가 없다면, 서비스는 엔드포인트에 대한 접속을 같은 컴퓨터의 파드로만 연결할 수 있고 다른 파드로는 연결할 수 없게 됨
- 서비스에 비해 플라넬은 눈에 띄지 않는 존재이지만 서비스의 구조를 뒷받침하고 있음
| 구분 | 플라넬 (Flannel) | 서비스 (Service) |
|---|---|---|
| 역할 | 노드를 넘나드는 파드 간 통신 경로 제공 | 컨테이너 접속 창구(엔드포인트) 제공 |
| 위치 | 기반 기술 (오버레이 네트워크) | 상위 추상화 (Discovery & LB) |
| 구현 수단 | flanneld 에이전트 + IPv4 오버레이 + etcd | 가상 IP 주소 + 네트워크 주소 변환 |
| 의존 관계 | 서비스가 플라넬 위에서 동작 | 플라넬이 없으면 같은 노드의 파드로만 연결 |
용어 정리
- 플라넬 (Flannel): 쿠버네티스 클러스터의 노드들을 연결하는 IPv4 오버레이 네트워크를 구축하는 방식
- flanneld: 모든 노드에서 구동되며 패킷 전달과 노드별 서브넷 할당을 담당하는 에이전트 프로그램
- etcd: 쿠버네티스의 데이터 스토어. 클러스터 구성 정보를 저장함
- 오버레이 네트워크 (Overlay Network): 기존 물리 네트워크 위에 가상으로 구성한 논리 네트워크
핵심 요약
5-1장. 컨테이너 오케스트레이션과 쿠버네티스의 기본 구조 요약:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
[컨테이너 오케스트레이션]
├─ 정의: 컨테이너 관리·운영의 자동화
├─ 로드 밸런싱: 여러 컨테이너에 요청 분산 → 처리 시간 단축·처리량 증가
├─ 헬스 체크: 요청/응답으로 정상 동작 감시 → LB와 결합해 비정상 컨테이너 배제
├─ 스케일링: 메트릭 임곗값 기준으로 컨테이너 증감 → 리소스 최적화·다운 방지
└─ 수동도 가능하나 컨테이너가 늘수록 한계 → 자동화의 중요성 증가
[쿠버네티스]
├─ 구글이 개발해 오픈 소스로 공개한 오케스트레이션 도구
├─ 가능: 로드 밸런싱 · 헬스 체크 · 엔드포인트 제공
├─ 불가능: 자동 빌드 · 미들웨어 기능 (별도 도구·서비스 필요)
├─ 대안: 도커 스웜 모드 / 아파치 메소스 + 마라톤 → 그래도 쿠버네티스가 사실상 표준
└─ 클러스터 = 노드의 집합, 노드 = 마스터(제어) + 워커(파드 구동)
[파드]
├─ 컨테이너 관리의 최소 단위 (1개 이상의 컨테이너)
├─ 공유: 스토리지 · 네트워크 · (설정 시) 프로세스 네임스페이스 · 라이프 사이클
├─ 기준: 밀접한 것만 같은 파드에, 나머지는 분리 → 선택적 구동·세밀한 스케일링
├─ 필요성: 프로세스를 직접 관리하는 대신 컨테이너 관리를 쿠버네티스에 위임
└─ 패턴: 기본은 one-container-per-pod, 보조는 사이드카(Envoy, 자동화는 Istio)
[디플로이먼트 컨트롤러]
├─ 포함 관계: 디플로이먼트 > 레플리카셋 > 파드 > 컨테이너
├─ 레플리카셋: 같은 유형 파드를 지정 수만큼 유지 → 헬스 체크·스케일링·롤링 업데이트
├─ 디플로이먼트: 레플리카셋/파드 갱신을 자동화 (보통 같은 앱의 다른 버전을 포함)
├─ 컨트롤러: 현재 상태 → 설정한 상태로 조정 (에어컨 비유)
└─ 디플로이먼트 컨트롤러: 상태 감시 → 차이에 맞는 동작 결정 → 동작 실행
[서비스]
├─ 컨테이너 접속 창구(엔드포인트) 제공 — 기동/정지를 반복해도 정확히 연결
├─ 구조: 가상 IP 주소 + 네트워크 주소 변환(NAT)
├─ 유형: ClusterIP(내부) · NodePort(전 노드 포트) · LoadBalancer(외부) · ExternalName(외부 호스트)
├─ Discovery & LB: 이름 확인 + 로드 밸런싱 (ExternalName만 직접 구성 필요)
└─ 구분: 내부만 → ClusterIP, 외부 → LoadBalancer, NodePort는 예외 상황에 강점
[플라넬]
├─ 파드 내 통신: 네트워크 네임스페이스 공유 → localhost (포트 충돌 주의)
├─ 파드 간 통신: 파드마다 고유 IP → 포트 할당 방식의 복잡성·개수 제한 해소
├─ 요건: NAT 없이 모든 노드의 모든 파드와 통신 (구현 방법은 구축 시 선택)
├─ flanneld: 전 노드 에이전트 · 목적지 노드 특정 후 패킷 전송 · 노드별 서브넷 할당 · etcd 저장
└─ 서비스와의 관계: 플라넬은 기반 기술, 서비스는 그 IPv4 네트워크 위에서 동작
참고 자료
관련 자료:
- Kubernetes 공식 문서: https://kubernetes.io/ko/docs/home/
- 쿠버네티스 클러스터 아키텍처: https://kubernetes.io/docs/concepts/architecture/
- 파드(Pod): https://kubernetes.io/docs/concepts/workloads/pods/
- 사이드카 컨테이너: https://kubernetes.io/docs/concepts/workloads/pods/sidecar-containers/
- 레플리카셋(ReplicaSet): https://kubernetes.io/docs/concepts/workloads/controllers/replicaset/
- 디플로이먼트(Deployment): https://kubernetes.io/docs/concepts/workloads/controllers/deployment/
- 컨트롤러(Controller): https://kubernetes.io/docs/concepts/architecture/controller/
- 서비스(Service): https://kubernetes.io/docs/concepts/services-networking/service/
- 클러스터 네트워킹 요건: https://kubernetes.io/docs/concepts/cluster-administration/networking/
- Flannel: https://github.com/flannel-io/flannel
- etcd: https://etcd.io/
- Envoy Proxy: https://www.envoyproxy.io/
- Istio: https://istio.io/
- Docker Swarm 모드: https://docs.docker.com/engine/swarm/
- Apache Mesos: https://mesos.apache.org/